Reorder list

Time: O(N); Space: O(1); medium

Given a singly linked list L: L0 → L1 → … → Ln-1 → Ln

reorder it to: L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …

Example 1:

Input: head = {ListNode} 1->2->3->4->None

Output: {ListNode} 1->4->2->3->None

Example 2:

Input: head = {ListNode} 1->2->3->4->5->None

Output: {ListNode} 1->5->2->4->3->None

Challenge:

  • Can you do this in-place without altering the nodes’ values?

[1]:
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

    def __repr__(self):
        if self:
            return "{} -> {}".format(self.val, repr(self.next))
[2]:
class Solution1(object):
    """
    Time: O(N)
    Space: O(1)
    """
    def reorderList(self, head):
        """
        :type head: ListNode
        :rtype: Do not return anything, modify nums in-place instead.
        """
        if head == None or head.next == None:
            return head

        fast, slow, prev = head, head, None
        while fast != None and fast.next != None:
            fast, slow, prev = fast.next.next, slow.next, slow
        current, prev.next, prev = slow, None, None

        while current != None:
            current.next, prev, current = prev, current, current.next

        l1, l2 = head, prev
        dummy = ListNode(0)
        current = dummy

        while l1 != None and l2 != None:
            current.next, current, l1 = l1, l1, l1.next
            current.next, current, l2 = l2, l2, l2.next

        return dummy.next
[3]:
s = Solution1()

head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
s.reorderList(head)
assert head.val == 1
assert head.next.val == 4
assert head.next.next.val == 2
assert head.next.next.next.val == 3

head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)
s.reorderList(head)
assert head.val == 1
assert head.next.val == 5
assert head.next.next.val == 2
assert head.next.next.next.val == 4
assert head.next.next.next.next.val == 3